package com.lambda.lambda.lambda;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * 一：方法引用
 * 若lambda体中方法已经被实现了，可以用方法引用
 * lambda的另一种表达形式
 *
 * 对象::实例方法名
 * 类::实例方法名
 * 类::静态方法名
 *
 * 注意事项：
 * 1、lambda体中使用方法的参数列表和返回值类型要和函数式接口抽象方法的参数和返回值类型一致
 * 2、lambda表达式参数列表中第一个参数是实例方法的调用者，第二个参数是实例方法的参数时，可以使用 类::实例方法名
 *
 *
 *
 * 二：构造器引用
 * 格式：ClassName::new
 * 需要调用的构造器的参数列表要与函数式接口的抽象方法的参数列表保持一致
 *
 *
 * 三：数组引用
 * Type::new
 */
public class Construct {

    //数组引用
    @Test
    public void test3(){
        Function<Integer,String[]> fu=x->new String[x];
        System.out.println(fu.apply(10).length);

        Function<Integer,String[]> fun=String[]::new;
        System.out.println(fu.apply(20).length);
    }
    //构造器引用
    @Test
    public void test2(){
        Supplier<Student> su=()->new Student();

        Supplier<Student> sup=Student::new;
        System.out.println(sup.get());

    }
    //类::实例方法名
    @Test
    public void test1(){
        BiPredicate<String,String> bp=(x,y)->x.equals(y);
        BiPredicate<String,String> bpr=String::equals;
        System.out.println(bp.test("a", "b"));

    }

   //类::静态方法名
    @Test
    public void test01(){
        Comparator<Integer> co=(x,y)->Integer.compare(x,y);
        Comparator<Integer> com=Integer::compare;
        System.out.println(com.compare(1, 2));

    }

    //对象::实例方法名
    @Test
    public void test02(){
        Student student = new Student();
        Supplier<String> su=()->student.getName();
        System.out.println(su.get());

        Supplier<String> sup=student::getName;
        System.out.println(sup.get());
    }
}
